<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace app\lib\socket;
use GatewayWorker\Lib\Gateway;
use think\facade\Cache;
use Workerman\Worker;

/**
 * Worker 命令行服务类
 */
class Events
{
    /**
     * onWorkerStart 事件回调
     * 当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次
     *
     * @access public
     * @param  \Workerman\Worker    $businessWorker
     * @return void
     */
    public static function onWorkerStart(Worker $businessWorker)
    {
        $app = new \think\worker\Application;
        $app->initialize();
    }

    /**
     * onConnect 事件回调
     * 当客户端连接上gateway进程时(TCP三次握手完毕时)触发
     *
     * @access public
     * @param  int       $client_id
     * @return void
     */
    public static function onConnect($client_id)
    {
        // Gateway::sendToCurrentClient("Your client_id is $client_id");
    }

    /**
     * onWebSocketConnect 事件回调
     * 当客户端连接上gateway完成websocket握手时触发
     *
     * @param  integer  $client_id 断开连接的客户端client_id
     * @param  mixed    $data
     * @return void
     */
    public static function onWebSocketConnect($client_id, $data)
    {
        // var_export($data);
    }

    /**
     * onMessage 事件回调
     * 当客户端发来数据(Gateway进程收到数据)后触发
     *
     * @access public
     * @param  int       $client_id
     * @param  mixed     $data
     * @return void
     */
    public static function onMessage($client_id, $data)
    {
        //  var_export($data);
        // Gateway::sendToAll($data);
        // 验证客户端是否绑定uid
        if(Gateway::getUidByClientId($client_id)) return;
        $data = json_decode($data,true);
        if(!is_array($data) || !array_key_exists('type',$data) || !array_key_exists('token',$data) || $data['type'] != 'bind' || empty($data['token'])) return;
        $user = Cache::get($data['token']);
        if(!$user) return  Gateway::sendToCurrentClient(json_encode(['type' => 'bind', 'msg' => '非法token,禁止操作','status' => false]));
        // 获取userId
        $userId = array_key_exists('type',$user) ? $user['user_id'] : $user['id'];
        // 验证第三方是否绑定手机
        if($userId < 1) return Gateway::sendToCurrentClient(json_encode(['type' => 'bind', 'msg' => '请先绑定手机','status' => false]));
        // 验证用户状态
        if($user['status'] == 0) return Gateway::sendToCurrentClient(json_encode(['type' => 'bind', 'msg' => '当前用户被禁用','status' => false]));
        // 绑定用户id
        Gateway::bindUid($client_id,$userId);
        return Gateway::sendToCurrentClient(json_encode(['type' => 'bind', 'msg' => '绑定成功','status' => true]));


        
    }

    /**
     * onClose 事件回调 当用户断开连接时触发的方法
     *
     * @param  integer $client_id 断开连接的客户端client_id
     * @return void
     */
    public static function onClose($client_id)
    {
        // GateWay::sendToAll("client[$client_id] logout\n");
    }

    /**
     * onWorkerStop 事件回调
     * 当businessWorker进程退出时触发。每个进程生命周期内都只会触发一次。
     *
     * @param  \Workerman\Worker    $businessWorker
     * @return void
     */
    public static function onWorkerStop(Worker $businessWorker)
    {
        // echo "WorkerStop\n";
    }
}
